ARM指令集.docx 您所在的位置:网站首页 arm blx指令 ARM指令集.docx

ARM指令集.docx

2023-03-25 06:11| 来源: 网络整理| 查看: 265

ARM指令集.docx

《ARM指令集.docx》由会员分享,可在线阅读,更多相关《ARM指令集.docx(16页珍藏版)》请在冰豆网上搜索。

ARM指令集.docx

ARM指令集

ARM指令集

一、ARM微处理器的指令的分类与格式  

ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,

而对系统存储器的访问则需要通过专门的加载/存储指令来完成。

ARM微处理器的指令集可以分为跳转指令、数据处理指令、

程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类。

下面是ARM微处理器的基本指令。

助记符  指令功能描述

ADC  带进位加法指令

ADD  加法指令

AND  逻辑与指令

B  跳转指令

BIC  位清零指令

BL  带返回的跳转指令

BLX  带返回和状态切换的跳转指令

BX  带状态切换的跳转指令

CDP  协处理器数据操作指令

CMN  比较反值指令

CMP  比较指令

EOR  异或指令

LDC  存储器到协处理器的数据传输指令

LDM  加载多个寄存器指令

LDR  存储器到寄存器的数据传输指令

MCR  从ARM寄存器到协处理器寄存器的数据传输指令

MLA  乘加运算指令

MOV  数据传送指令

MRC  从协处理器寄存器到ARM寄存器的数据传输指令

MRS  传送CPSR或SPSR的内容到通用寄存器指令

MSR  传送通用寄存器到CPSR或SPSR的指令

MUL  32位乘法指令

MLA  32位乘加指令

MVN  数据取反传送指令

ORR  逻辑或指令

RSB  逆向减法指令

RSC  带借位的逆向减法指令

SBC  带借位减法指令

STC  协处理器寄存器写入存储器指令

STM  批量内存字写入指令

STR  寄存器到存储器的数据传输指令

SUB  减法指令

SWI  软件中断指令

SWP  交换指令

TEQ  相等测试指令

TST  位测试指令

--------------------------------------------------------------------------------------------------------------------------

二、指令的条件域

当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有

条件的执行。

当指令的执行条件满足时,指令被执行,否则指令被忽略。

每一条ARM指令包含4位的条件码,位于指令的最高4位[31:

28]。

条件码共有16种,每种条件码

可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。

16种条件标志码中只有15种可以使

用,标志码1111保留不用。

条件码  助记符后缀标志   含义

0000  EQ  Z置位   相等

0001  NE  Z清零   不相等

0010  CS  C置位   无符号数大于或等于

0011  CC  C清零   无符号数小于

0100  MI  N置位   负数

0101  PL  N清零   正数或零

0110  VS  V置位   溢出

0111  VC  V清零   未溢出

1000  HI  C置位Z清零  无符号数大于

1001  LS  C清零Z置位  无符号数小于或等于

1010  GE  N等于V  带符号数大于或等于

1011  LT  N不等于V  带符号数小于

1100  GT  Z清零且(N等于V)带符号数大于

1101  LE  Z置位或(N不等于V)带符号数小于或等于

1110  AL  忽略   无条件执行

-------------------------------------------------------------------------------------------------------------------------

三、ARM指令的寻址方式

1、立即寻址  操作数在指令中直接给出

ADDR0,R0,#1;R0←R0+1

ADDR0,R0,#0x3f;R0←R0+0x3f

2、寄存器寻址  操作数在寄存器

ADDR0,R1,R2;R0←R1+R2

3、寄存器间接寻址操作数的地址在寄存器

ADDR0,R1,[R2];R0←R1+[R2]

LDRR0,[R1];R0←[R1]

STRR0,[R1];[R1]←R0

4、基址变址寻址  操作数地址=基址寄存器+指令中给出的地址偏移

LDRR0,[R1,#4];R0←[R1+4]

LDRR0,[R1,#4]!

;R0←[R1+4]、R1←R1+4

LDRR0,[R1],#4;R0←[R1]、R1←R1+4

LDRR0,[R1,R2];R0←[R1+R2]

5、多寄存器寻址  类似寄存器寻址,此处是多个寄存器而已

LDMIAR0,{R1,R2,R3,R4};R1←[R0]

    ;R2←[R0+4]

    ;R3←[R0+8]

    ;R4←[R0+12]

6、相对寻址  目标地址=pc当前值+指令给出的标号偏移地址

BLNEXT;跳转到子程序NEXT处执行

......

NEXT

......

MOVPC,LR;从子程序返回

7、堆栈寻址

ARM微处理器支持这四种类型的堆栈工作方式。

-满递增堆栈:

堆栈指针指向最后压入的数据,且由低地址向高地址生成。

-满递减堆栈:

堆栈指针指向最后压入的数据,且由高地址向低地址生成。

-空递增堆栈:

堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。

-空递减堆栈:

堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。

-----------------------------------------------------------------------------------------------------------------------

四、ARM指令集

1、跳转指令

—使用专门的跳转指令。

    32MB地址空间

—直接向程序计数器PC写入跳转地址值。

  4GB地址空间

—B跳转指令

—BL带返回的跳转指令

—BLX带返回和状态切换的跳转指令

—BX带状态切换的跳转指令

B{条件}目标地址其他的类似

2、数据处理指令

数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。

数据传送指令用于在寄存器和存储器之间进行数据的双向传输。

算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器

中,同时更新CPSR中的相应条件标志位。

比较指令不保存运算结果,只更新CPSR中相应的条件标志位。

数据处理指令包括:

—MOV数据传送指令  MOV{条件}{S}目的寄存器,源操作数

MOVR1,R0   ;将寄存器R0的值传送到寄存器R1

MOVPC,R14   ;将寄存器R14的值传送到PC,常用于子程序返回

MOVR1,R0,LSL#3  ;将寄存器R0的值左移3位后传送到R1

—MVN数据取反传送指令  MVN{条件}{S}目的寄存器,源操作数

MVNR0,#0   ;将立即数0取反传送到寄存器R0中,完成后R0=-1

—CMP比较指令   CMP{条件}操作数1,操作数2

CMPR1,R0   ;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位

CMPR1,#100   ;将寄存器R1的值与立即数100相减,并根据结果设置CPSR的标志位

—CMN反值比较指令  CMN{条件}操作数1,操作数2

CMNR1,R0   ;将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位

CMNR1,#100   ;将寄存器R1的值与立即数100相加,并根据结果设置CPSR的标志位

—TST位测试指令  TST{条件}操作数1,操作数2

TSTR1,#%1   ;用于测试在寄存器R1中是否设置了最低位(%表示二进制数)

TSTR1,#0xffe  ;将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位

—TEQ相等测试指令  TEQ{条件}操作数1,操作数2

TEQR1,R2   ;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位

—ADD加法指令   ADD{条件}{S}目的寄存器,操作数1,操作数2

ADDR0,R1,R2   ;R0=R1+R2

ADDR0,R1,#256  ;R0=R1+256

ADDR0,R2,R3,LSL#1  ;R0=R2+(R3

—ADC带进位加法指令  ADC{条件}{S}目的寄存器,操作数1,操作数2

ADDSR0,R4,R8  ;加低端的字

ADCSR1,R5,R9  ;加第二个字,带进位

ADCSR2,R6,R10  ;加第三个字,带进位

ADCR3,R7,R11  ;加第四个字,带进位

—SUB减法指令   SUB{条件}{S}目的寄存器,操作数1,操作数2

SUBR0,R1,R2   ;R0=R1-R2

SUBR0,R1,#256  ;R0=R1-256

SUBR0,R2,R3,LSL#1  ;R0=R2-(R3

—SBC带借位减法指令  SBC{条件}{S}目的寄存器,操作数1,操作数2

SUBSR0,R1,R2  ;R0=R1-R2-!

C,并根据结果设置CPSR的进位标志位

—RSB逆向减法指令  RSC{条件}{S}目的寄存器,操作数1,操作数2

RSBR0,R1,R2   ;R0=R2–R1

RSBR0,R1,#256  ;R0=256–R1

RSBR0,R2,R3,LSL#1  ;R0=(R3

—RSC带借位的逆向减法指令RSC{条件}{S}目的寄存器,操作数1,操作数2

RSCR0,R1,R2   ;R0=R2–R1-!

C

—AND逻辑与指令  AND{条件}{S}目的寄存器,操作数1,操作数2

ANDR0,R0,#3  ;该指令保持R0的0、1位,其余位清零。

—ORR逻辑或指令  ORR{条件}{S}目的寄存器,操作数1,操作数2

ORRR0,R0,#3  ;该指令设置R0的0、1位,其余位保持不变

—EOR逻辑异或指令  EOR{条件}{S}目的寄存器,操作数1,操作数2

EORR0,R0,#3  ;该指令反转R0的0、1位,其余位保持不变。

—BIC位清除指令  BIC{条件}{S}目的寄存器,操作数1,操作数2

BICR0,R0,#%1011  ;该指令清除R0中的位0、1、和3,其余的位保持不变。

3、乘法指令与乘加指令

ARM微处理器支持的乘法指令与乘加指令共有6条,可分为运算结果为32位和运算结果为64

位两类,与前面的数据处理指令不同,指令中的所有操作数、目的寄存器必须为通用寄存器,不能

对操作数使用立即数或被移位的寄存器,同时,目的寄存器和操作数1必须是不同的寄存器。

乘法指令与乘加指令共有以下6条:

—MUL32位乘法指令  MUL{条件}{S}目的寄存器,操作数1,操作数2

MULR0,R1,R2   ;R0=R1×R2

MULSR0,R1,R2  ;R0=R1×R2,同时设置CPSR中的相关条件标志位

—MLA32位乘加指令  MLA{条件}{S}目的寄存器,操作数1,操作数2,操作数3

MLAR0,R1,R2,R3  ;R0=R1×R2+R3

MLASR0,R1,R2,R3  ;R0=R1×R2+R3,同时设置CPSR中的相关条件标志位

—SMULL64位有符号数乘法指令SMULL{条件}{S}目的寄存器Low,目的寄存器低High,操作数1,操作数2

SMULLR0,R1,R2,R3  ;R0=(R2×R3)的低32位

    ;R1=(R2×R3)的高32位

—SMLAL64位有符号数乘加指令SMLAL{条件}{S}目的寄存器Low,目的寄存器低High,操作数1,操作数2

SMLALR0,R1,R2,R3  ;R0=(R2×R3)的低32位+R0

    ;R1=(R2×R3)的高32位+R1

—UMULL64位无符号数乘法指令UMULL{条件}{S}目的寄存器Low,目的寄存器低High,操作数1,操作数2

UMULLR0,R1,R2,R3  ;R0=(R2×R3)的低32位

    ;R1=(R2×R3)的高32位

—UMLAL64位无符号数乘加指令UMLAL{条件}{S}目的寄存器Low,目的寄存器低High,操作数1,操作数2

UMLALR0,R1,R2,R3  ;R0=(R2×R3)的低32位+R0

    ;R1=(R2×R3)的高32位+R1

4、程序状态寄存器访问指令

ARM微处理器支持程序状态寄存器访问指令,用于在程序状态寄存器和通用寄存器之间传送

数据,程序状态寄存器访问指令包括以下两条:

—MRS程序状态寄存器到通用寄存器的数据传送指令   MRS{条件}通用寄存器,程序状态寄存器(CPSR或SPSR)

MRSR0,CPSR;传送CPSR的内容到R0

MRSR0,SPSR;传送SPSR的内容到R0

—MSR通用寄存器到程序状态寄存器的数据传送指令   MSR{条件}程序状态寄存器(CPSR或SPSR)_,操作数

MSRCPSR,R0;传送R0的内容到CPSR

MSRSPSR,R0;传送R0的内容到SPSR

MSRCPSR_c,R0;传送R0的内容到SPSR,但仅仅修改CPSR中的控制位域

5、加载/存储指令

ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储

器中的数据传送到寄存器,存储指令则完成相反的操作。

常用的加载存储指令如下:

—LDR字数据加载指令  LDR{条件}目的寄存器,

LDRR0,[R1]   ;将存储器地址为R1的字数据读入寄存器R0。

LDRR0,[R1,R2]  ;将存储器地址为R1+R2的字数据读入寄存器R0。

LDRR0,[R1,#8]  ;将存储器地址为R1+8的字数据读入寄存器R0。

LDRR0,[R1,R2]!

  ;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。

LDRR0,[R1,#8]!

  ;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。

LDRR0,[R1],R2  ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。

LDRR0,[R1,R2,LSL#2]!

;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

LDRR0,[R1],R2,LSL#2;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

—LDRB字节数据加载指令LDR{条件}B目的寄存器,

LDRBR0,[R1]   ;将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零。

LDRBR0,[R1,#8]  ;将存储器地址为R1+8的字节数据读入寄存器R0,并将R0的高24位清零。

—LDRH半字数据加载指令LDR{条件}H目的寄存器,

LDRHR0,[R1]   ;将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16位清零。

LDRHR0,[R1,#8]  ;将存储器地址为R1+8的半字数据读入寄存器R0,并将R0的高16位清零。

LDRHR0,[R1,R2]  ;将存储器地址为R1+R2的半字数据读入寄存器R0,并将R0的高16位清零。

—STR字数据存储指令  STR{条件}源寄存器,

STRR0,[R1],#8  ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。

STRR0,[R1,#8]  ;将R0中的字数据写入以R1+8为地址的存储器中。

—STRB字节数据存储指令STR{条件}B源寄存器,

STRBR0,[R1]   ;将寄存器R0中的字节数据写入以R1为地址的存储器中。

STRBR0,[R1,#8]  ;将寄存器R0中的字节数据写入以R1+8为地址的存储器中。

—STRH半字数据存储指令STR{条件}H源寄存器,

STRHR0,[R1]   ;将寄存器R0中的半字数据写入以R1为地址的存储器中。

STRHR0,[R1,#8]  ;将寄存器R0中的半字数据写入以R1+8为地址的存储器中。

6、批量数据加载/存储指令

ARM微处理器所支持批量数据加载/存储指令可以一次在一片连续的存储器单元和多个寄存器

之间传送数据,批量加载指令用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储

指令则完成相反的操作。

常用的加载存储指令如下:

—LDM批量数据加载指令

—STM批量数据存储指令

LDM(或STM)指令

LDM(或STM)指令的格式为:

LDM(或STM){条件}{类型}基址寄存器{!

},寄存器列表{∧}

LDM(或STM)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄

  存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。

其中,{类型}为以下几种情况:

IA每次传送后地址加1;

IB每次传送前地址加1;

DA每次传送后地址减1;

DB每次传送前地址减1;

FD满递减堆栈;

ED空递减堆栈;

FA满递增堆栈;

EA空递增堆栈;

{!

}为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否

则基址寄存器的内容不改变。

基址寄存器不允许为R15,寄存器列表可以为R0~R15的任意组合。

{∧}为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:

除了正常的数据

传送之外,还将SPSR复制到CPSR。

同时,该后缀还表示传入或传出的是用户模式下的寄存器,而

不是当前模式下的寄存器。

STMFDR13!

,{R0,R4-R12,LR};将寄存器列表中的寄存器(R0,R4到R12,LR)存入堆栈。

LDMFDR13!

,{R0,R4-R12,PC};将堆栈内容恢复到寄存器(R0,R4到R12,LR)。

7、数据交换指令

ARM微处理器所支持数据交换指令能在存储器和寄存器之间交换数据。

数据交换指令有如下

两条:

—SWP字数据交换指令  SWP{条件}目的寄存器,源寄存器1,[源寄存器2]

SWPR0,R1,[R2];将R2所指向的存储器中的字数据传送到R0,同时将R1中的字数据传

送到R2所指向的存储单元。

SWPR0,R0,[R1];该指令完成将R1所指向的存储器中的字数据与R0中的字数据交换。

—SWPB字节数据交换指令SWP{条件}B目的寄存器,源寄存器1,[源寄存器2]

SWPBR0,R1,[R2];将R2所指向的存储器中的字节数据传送到R0,R0的高24位清零,

同时将R1中的低8位数据传送到R2所指向的存储单元。

SWPBR0,R0,[R1];该指令完成将R1所指向的存储器中的字节数据与R0中的低8位数据

交换。

8、移位指令

ARM微处理器内嵌的桶型移位器(BarrelShifter),支持数据的各种移位操作,移位操作在

ARM指令集中不作为单独的指令使用,它只能作为指令格式中是一个字段,在汇编语言中表示为指

令中的选项。

例如,数据处理指令的第二个操作数为寄存器时,就可以加入移位操作选项对它进行

各种移位操作。

移位操作包括如下6种类型,ASL和LSL是等价的,可以自由互换:

—LSL逻辑左移   通用寄存器,LSL(或ASL)操作数

MOVR0,R1,LSL#2;将R1中的内容左移两位后传送到R0中。

—LSR逻辑右移   通用寄存器,LSR操作数

MOVR0,R1,LSR#2;将R1中的内容右移两位后传送到R0中,左端用零来填充

—ASR算术右移   通用寄存器,ASR操作数

MOVR0,R1,ASR#2;将R1中的内容右移两位后传送到R0中,左端用第31位的值来填充

—ASL算术左移   通用寄存器,ASR操作数

MOVR0,R1,ASL#2;将R1中的内容右移两位后传送到R0中,右端用第2位的值来填充

—ROR循环右移   通用寄存器,ROR操作数

MOVR0,R1,ROR#2;将R1中的内容循环右移两位后传送到R0中。

—RRX带扩展的循环右移  通用寄存器,RRX操作数

MOVR0,R1,RRX#2;将R1中的内容进行带扩展的循环右移两位后传送到R0中。

9、协处理器指令

ARM微处理器可支持多达16个协处理器,用于各种协处理操作,在程序执行的过程中,每个

协处理器只执行针对自身的协处理指令,忽略ARM处理器和其他协处理器的指令。

ARM的协处理器指令主要用于ARM处理器初始化ARM协处理器的数据处理操作,以及在

ARM处理器的寄存器和协处理器的寄存器之间传送数据,和在ARM协处理器的寄存器和存储器之

间传送数据。

ARM协处理器指令包括以下5条:

—CDP协处理器数操作指令

—LDC协处理器数据加载指令

—STC协处理器数据存储指令

—MCRARM处理器寄存器到协处理器寄存器的数据传送指令

—MRC协处理器寄存器到ARM处理器寄存器的数据传送指令

---CDP指令

CDP指令的格式为:

CDP{条件}协处



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有